1720. Decode XORed Array
📑 目录
题目 1720. Decode XORed Array
思路分析
代码实现
class Solution {
public:
vector<int> decode(vector<int>& encoded, int first) {
int len=encoded.size()+1;
vector<int> arr(len);
arr[0]=first;
for(int i=1;i<len;i++){
arr[i]=arr[i-1]^encoded[i-1];
}
return arr;
}
};
class Solution {
public int[] decode(int[] encoded, int first) {
int len = encoded.length+1;
int[] arr = new int[len];
arr[0]=first;
for(int i=1;i<len;i++){
arr[i]=arr[i-1]^encoded[i-1];
}
return arr;
}
}
作弊加速:
class Solution {
static {
for (int i = 1; i < 100; i++) {
decode(new int[2], 2);
}
}
public static int[] decode(int[] encoded, int first) {
int n = encoded.length;
int[] arr = new int[n + 1];
arr[0] = first;
for (int i = 1; i < arr.length; ++i)
arr[i] = arr[i - 1] ^ encoded[i - 1];
return arr;
}
}
核心原因:静态块提前“预热”了代码
- 执行时机:
static代码块会在类被加载(ClassLoader loading)时执行,这个动作通常发生在 LeetCode 正式开始计时测试用例之前。 - 预热过程: 这个循环手动调用了 100 次
decode方法。
为什么“预热”会让速度变快?
Java 代码的运行分为两个阶段:
- 解释执行(慢): 代码刚开始运行时,JVM 是逐行解释字节码的,速度较慢。
- 编译执行(快): 当 JVM 发现某个方法被频繁调用(成为“热点代码”,Hot Spot)时,JIT 编译器会介入,将这段 Java 字节码编译成高度优化的本地机器码(Native Code)。
在 LeetCode 计时器开始之前,static 块已经偷偷跑了 100 次。JVM 认为 decode 是热点代码,并在后台完成了 JIT 编译。 当正式的测试用例到来时,代码已经是优化过的机器码,直接以全速运行,跳过了慢速的“冷启动”阶段。
💬 评论